package com.nanbei.future;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @ClassDescription: CompletableFuture 线程池测试
 * @JdkVersion: 1.8
 * @Author: libs
 * @Created: 2024/9/26 15:02
 */
public class CompletableFutureThreadPool {
    public static void main(String[] args) {

        ExecutorService threadPool = Executors.newFixedThreadPool(4);

        //1 没有传入自定义线程池，都用默认线程池ForkJoinPool;
        //2 传入了一个自定义线程池，
        //      如果你执行第一个任务的时候，传入了一个自定义线程池:
        //      调用thenRun方法执行第二个任务时，则第二个任务和第一个任务是共用同一个线程池。
        //      调用thenRunAsync执行第二个任务时，则第一个任务使用的是你自己传入的线程池，第二个任务使用的是ForkJoin线程池

        try{
            CompletableFuture.runAsync(() -> {
                try { TimeUnit.MILLISECONDS.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); }
                System.out.println("任务 1 使用的线程名称为： " + Thread.currentThread().getName());
            },threadPool).thenRunAsync(()->{
                try { TimeUnit.MILLISECONDS.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); }
                System.out.println("任务 2 使用的线程名称为： " + Thread.currentThread().getName());
            }).thenRun(()->{
                try { TimeUnit.MILLISECONDS.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); }
                System.out.println("任务 3 使用的线程名称为： " + Thread.currentThread().getName());
            }).thenRun(()->{
                try { TimeUnit.MILLISECONDS.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); }
                System.out.println("任务 4 使用的线程名称为： " + Thread.currentThread().getName());
            });

            try { TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();
        }
    }
}
